package estates.model;

import java.util.HashMap;
import java.util.List;
import javax.persistence.*;

@Entity
@DiscriminatorValue("DekoratorBudynkowy")
public class DekoratorBudynkowy extends Dekorator {

  private int rok_budowy;
  private String stan_prawny;
  private int liczba_pieter;
  private int liczba_pokoi;
  private String ulica;
  private int kod_pocztowy;
  private int numer_budynku;

  public DekoratorBudynkowy() {
  }

  public DekoratorBudynkowy(Estate e) {
    super(e);
  }

  public int getRokBudowy() {
    return rok_budowy;
  }

  public String getStanPrawny() {
    return stan_prawny;
  }

  public int getLiczbaPieter() {
    return liczba_pieter;
  }

  public int getliczbaPokoi() {
    return liczba_pokoi;
  }

  public String getUlica() {
    return ulica;
  }

  public int getKodPocztowy() {
    return kod_pocztowy;
  }

  public int getNumerBudynku() {
    return numer_budynku;
  }

  @Override
  public void dekoruj(HashMap<String, Object> hm) {
    if (hm.containsKey("rok_budowy")) {
      this.rok_budowy = (Integer) hm.get("rok_budowy");
    }
    if (hm.containsKey("stan_prawny")) {
      this.stan_prawny = (String) hm.get("stan_prawny");
    }
    if (hm.containsKey("liczba_pieter")) {
      this.liczba_pieter = (Integer) hm.get("liczba_pieter");
    }
    if (hm.containsKey("liczba_pokoi")) {
      this.liczba_pokoi = (Integer) hm.get("liczba_pokoi");
    }
    if (hm.containsKey("ulica")) {
      this.ulica = (String) hm.get("ulica");
    }
    if (hm.containsKey("kod_pocztowy")) {
      this.kod_pocztowy = (Integer) hm.get("kod_pocztowy");
    }
    if (hm.containsKey("numer_budynku")) {
      this.numer_budynku = (Integer) hm.get("numer_budynku");
    }

    this.element.dekoruj(hm);
  }

  @Override
  public boolean equals(Object e) {
    if (!(e instanceof DekoratorBudynkowy)) {
      return false;
    }
    return element.equals(e);
  }

  @Override
  public int hashCode() {
    int hash = 5;
    hash = 53 * hash + this.rok_budowy;
    hash = 53 * hash + (this.stan_prawny != null ? this.stan_prawny.hashCode() : 0);
    hash = 53 * hash + this.liczba_pieter;
    hash = 53 * hash + this.liczba_pokoi;
    hash = 53 * hash + (this.ulica != null ? this.ulica.hashCode() : 0);
    hash = 53 * hash + this.kod_pocztowy;
    hash = 53 * hash + this.numer_budynku;
    return hash;
  }

  @Override
  public String toString() {
    String pom = element.toString();
    pom += "&DekoratorBudynkowy:&rok_budowy=" + rok_budowy +
            "&stan_prawny=" + stan_prawny +
            "&liczba_pieter=" + liczba_pieter +
            "&liczba_pokoi=" + liczba_pokoi +
            "&ulica=" + ulica +
            "&kod_pocztowy=" + kod_pocztowy +
            "&numer_budynku=" + numer_budynku;
    return pom;
  }

  @Override
  public int rPlaceByLiczbaPieter(int ilosc_kubkow) {
    int ret = 0;
    if (liczba_pieter >= 0 && liczba_pieter < 200) {
      ret = liczba_pieter % ilosc_kubkow;
    } else if (liczba_pieter >= 200) {
      ret = ilosc_kubkow - 1;
    } else {
      ret = 0;
    }
    return ret;
  }

  @Override
  public int rPlaceByRokBudowy(int ilosc_kubkow) {
    int ret = 0;
    if (rok_budowy - 1900 >= 0) {
      ret = ilosc_kubkow - 1 - (rok_budowy - 1900) % ilosc_kubkow; //algorytm dziala poprawnie do roku 2300
    } else {
      ret = 0;
    }
    return ret;
  }

  @Override
  public int rPlaceByliczbaPokoi(int ilosc_kubkow) {
    int ret = 0;
    if (liczba_pokoi >= 0 && liczba_pokoi < 60) {
      ret = ilosc_kubkow - 1 - liczba_pokoi % ilosc_kubkow;
    } else if (liczba_pokoi >= 60) {
      ret = 0;
    } else {
      ret = ilosc_kubkow - 1;
    }
    return ret;
  }

  @Override
  public HashMap<String, String> obliczSrednieOceny() {
	  return element.obliczSrednieOceny();
  }

    /*@Override
    public List<User> getInterestedUsers() {
        return element.getInterestedUsers();
    }

    @Override
    public boolean setInterestedUser(User u) {
        element.setInterestedUser(u);
        return true;
    }*/

}
